using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Attributes;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Attributes.DomainAttributes;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Enums;
using System.Collections.Generic;
using System.ComponentModel;

namespace Baci.ArcGIS._DataManagementTools._FeatureClass
{
    /// <summary>
    /// <para>Create Feature Class</para>
    /// <para>Creates an empty feature class in a geodatabase or a shapefile in a folder.</para>
    /// <para>在地理数据库中创建空要素类或在文件夹中创建 shapefile。</para>
    /// </summary>    
    [DisplayName("Create Feature Class")]
    public class CreateFeatureclass : AbstractGPProcess
    {
        /// <summary>
        /// 无参构造
        /// </summary>
        public CreateFeatureclass()
        {

        }

        /// <summary>
        /// 有参构造
        /// </summary>
        /// <param name="_out_path">
        /// <para>Feature Class Location</para>
        /// <para>The enterprise or file geodatabase or the folder in which the output feature class will be created. This workspace must already exist.</para>
        /// <para>企业级地理或文件地理数据库或将在其中创建输出要素类的文件夹。此工作区必须已存在。</para>
        /// </param>
        /// <param name="_out_name">
        /// <para>Feature Class Name</para>
        /// <para>The name of the feature class to be created.</para>
        /// <para>要创建的要素类的名称。</para>
        /// </param>
        public CreateFeatureclass(object _out_path, object _out_name)
        {
            this._out_path = _out_path;
            this._out_name = _out_name;
        }
        public override string ToolboxName => "Data Management Tools";

        public override string ToolName => "Create Feature Class";

        public override string CallName => "management.CreateFeatureclass";

        public override List<string> AcceptEnvironments => ["MResolution", "MTolerance", "XYDomain", "XYResolution", "XYTolerance", "ZResolution", "ZTolerance", "configKeyword", "geographicTransformations", "outputCoordinateSystem", "outputMFlag", "outputZFlag", "outputZValue"];

        public override object[] ParameterInfo => [_out_path, _out_name, _geometry_type.GetGPValue(), _template, _has_m.GetGPValue(), _has_z.GetGPValue(), _spatial_reference, _config_keyword, _spatial_grid_1, _spatial_grid_2, _spatial_grid_3, _out_feature_class, _out_alias];

        /// <summary>
        /// <para>Feature Class Location</para>
        /// <para>The enterprise or file geodatabase or the folder in which the output feature class will be created. This workspace must already exist.</para>
        /// <para>企业级地理或文件地理数据库或将在其中创建输出要素类的文件夹。此工作区必须已存在。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Feature Class Location")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _out_path { get; set; }


        /// <summary>
        /// <para>Feature Class Name</para>
        /// <para>The name of the feature class to be created.</para>
        /// <para>要创建的要素类的名称。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Feature Class Name")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _out_name { get; set; }


        /// <summary>
        /// <para>Geometry Type</para>
        /// <para><xdoc>
        ///   <para>Specifies the geometry type of the feature class.</para>
        ///   <bulletList>
        ///     <bullet_item>Point—The geometry type is point.</bullet_item><para/>
        ///     <bullet_item>Multipoint—The geometry type is multipoint.</bullet_item><para/>
        ///     <bullet_item>Polygon—The geometry type is polygon.</bullet_item><para/>
        ///     <bullet_item>Polyline—The geometry type is polyline.</bullet_item><para/>
        ///     <bullet_item>Multipatch—The geometry type is multipatch.</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>指定要素类的几何类型。</para>
        ///   <bulletList>
        ///     <bullet_item>点 （Point） - 几何类型为点。</bullet_item><para/>
        ///     <bullet_item>多点 - 几何类型为多点。</bullet_item><para/>
        ///     <bullet_item>面 - 几何类型为面。</bullet_item><para/>
        ///     <bullet_item>折线 - 几何类型为折线。</bullet_item><para/>
        ///     <bullet_item>多面体 - 几何类型为多面体。</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Geometry Type")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public _geometry_type_value _geometry_type { get; set; } = _geometry_type_value._POLYGON;

        public enum _geometry_type_value
        {
            /// <summary>
            /// <para>Point</para>
            /// <para>Point—The geometry type is point.</para>
            /// <para>点 （Point） - 几何类型为点。</para>
            /// </summary>
            [Description("Point")]
            [GPEnumValue("POINT")]
            _POINT,

            /// <summary>
            /// <para>Multipoint</para>
            /// <para>Multipoint—The geometry type is multipoint.</para>
            /// <para>多点 - 几何类型为多点。</para>
            /// </summary>
            [Description("Multipoint")]
            [GPEnumValue("MULTIPOINT")]
            _MULTIPOINT,

            /// <summary>
            /// <para>Polygon</para>
            /// <para>Polygon—The geometry type is polygon.</para>
            /// <para>面 - 几何类型为面。</para>
            /// </summary>
            [Description("Polygon")]
            [GPEnumValue("POLYGON")]
            _POLYGON,

            /// <summary>
            /// <para>Polyline</para>
            /// <para>Polyline—The geometry type is polyline.</para>
            /// <para>折线 - 几何类型为折线。</para>
            /// </summary>
            [Description("Polyline")]
            [GPEnumValue("POLYLINE")]
            _POLYLINE,

            /// <summary>
            /// <para>Multipatch</para>
            /// <para>Multipatch—The geometry type is multipatch.</para>
            /// <para>多面体 - 几何类型为多面体。</para>
            /// </summary>
            [Description("Multipatch")]
            [GPEnumValue("MULTIPATCH")]
            _MULTIPATCH,

        }

        /// <summary>
        /// <para>Template Dataset</para>
        /// <para>The feature class or table used as a template to define the attribute fields of the new feature class.</para>
        /// <para>用作模板的要素类或表，用于定义新要素类的属性字段。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Template Dataset")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public List<object> _template { get; set; } = null;


        /// <summary>
        /// <para>Has M</para>
        /// <para><xdoc>
        ///   <para>Specifies whether the feature class contains linear measurement values (m-values).</para>
        ///   <bulletList>
        ///     <bullet_item>No—The output feature class will not have M-values. This is the default.</bullet_item><para/>
        ///     <bullet_item>Yes—The output feature class will have M-values.</bullet_item><para/>
        ///     <bullet_item>Same as the template feature class—The output feature class will have M-values if the dataset specified in the Template Feature Class parameter (template parameter in Python) has M-values.</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>指定要素类是否包含线性测量值（m 值）。</para>
        ///   <bulletList>
        ///     <bullet_item>否 - 输出要素类将不具有 M 值。这是默认设置。</bullet_item><para/>
        ///     <bullet_item>是—输出要素类将具有 M 值。</bullet_item><para/>
        ///     <bullet_item>与模板要素类相同 - 如果在模板要素类参数（Python 中的模板参数）中指定的数据集具有 M 值，则输出要素类将具有 M 值。</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Has M")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public _has_m_value _has_m { get; set; } = _has_m_value._DISABLED;

        public enum _has_m_value
        {
            /// <summary>
            /// <para>No</para>
            /// <para>No—The output feature class will not have M-values. This is the default.</para>
            /// <para>否 - 输出要素类将不具有 M 值。这是默认设置。</para>
            /// </summary>
            [Description("No")]
            [GPEnumValue("DISABLED")]
            _DISABLED,

            /// <summary>
            /// <para>Same as the template feature class</para>
            /// <para>Same as the template feature class—The output feature class will have M-values if the dataset specified in the Template Feature Class parameter (template parameter in Python) has M-values.</para>
            /// <para>与模板要素类相同 - 如果在模板要素类参数（Python 中的模板参数）中指定的数据集具有 M 值，则输出要素类将具有 M 值。</para>
            /// </summary>
            [Description("Same as the template feature class")]
            [GPEnumValue("SAME_AS_TEMPLATE")]
            _SAME_AS_TEMPLATE,

            /// <summary>
            /// <para>Yes</para>
            /// <para>Yes—The output feature class will have M-values.</para>
            /// <para>是—输出要素类将具有 M 值。</para>
            /// </summary>
            [Description("Yes")]
            [GPEnumValue("ENABLED")]
            _ENABLED,

        }

        /// <summary>
        /// <para>Has Z</para>
        /// <para><xdoc>
        ///   <para>Specifies whether the feature class contains elevation values (z-values).</para>
        ///   <bulletList>
        ///     <bullet_item>No—The output feature class will not have Z-values. This is the default.</bullet_item><para/>
        ///     <bullet_item>Yes—The output feature class will have Z-values.</bullet_item><para/>
        ///     <bullet_item>Same as the template feature class—The output feature class will have Z-values if the dataset specified in the Template Feature Class parameter (template parameter in Python) has Z-values.</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>指定要素类是否包含高程值（z 值）。</para>
        ///   <bulletList>
        ///     <bullet_item>否 - 输出要素类将不具有 Z 值。这是默认设置。</bullet_item><para/>
        ///     <bullet_item>是—输出要素类将具有 Z 值。</bullet_item><para/>
        ///     <bullet_item>与模板要素类相同 - 如果在模板要素类参数（Python 中的模板参数）中指定的数据集具有 Z 值，则输出要素类将具有 Z 值。</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Has Z")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public _has_z_value _has_z { get; set; } = _has_z_value._DISABLED;

        public enum _has_z_value
        {
            /// <summary>
            /// <para>No</para>
            /// <para>No—The output feature class will not have Z-values. This is the default.</para>
            /// <para>否 - 输出要素类将不具有 Z 值。这是默认设置。</para>
            /// </summary>
            [Description("No")]
            [GPEnumValue("DISABLED")]
            _DISABLED,

            /// <summary>
            /// <para>Same as the template feature class</para>
            /// <para>Same as the template feature class—The output feature class will have Z-values if the dataset specified in the Template Feature Class parameter (template parameter in Python) has Z-values.</para>
            /// <para>与模板要素类相同 - 如果在模板要素类参数（Python 中的模板参数）中指定的数据集具有 Z 值，则输出要素类将具有 Z 值。</para>
            /// </summary>
            [Description("Same as the template feature class")]
            [GPEnumValue("SAME_AS_TEMPLATE")]
            _SAME_AS_TEMPLATE,

            /// <summary>
            /// <para>Yes</para>
            /// <para>Yes—The output feature class will have Z-values.</para>
            /// <para>是—输出要素类将具有 Z 值。</para>
            /// </summary>
            [Description("Yes")]
            [GPEnumValue("ENABLED")]
            _ENABLED,

        }

        /// <summary>
        /// <para>Coordinate System</para>
        /// <para><xdoc>
        ///   <para>The spatial reference of the output feature dataset. On the Spatial Reference Properties dialog box, you can select, import, or create a new coordinate system. To set aspects of the spatial reference, such as the x,y-, z-, or m-domain, resolution, or tolerance, use the Environments dialog box.</para>
        ///   <para>If a spatial reference is not provided, the output will have an undefined spatial reference.</para>
        ///   <para>The spatial reference of the Template Feature Class has no effect on the output spatial reference. If you want your output to be in the coordinate system of the Template Feature Class, set the Coordinate System parameter to the spatial reference of the Template Feature Class.</para>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>输出要素数据集的空间参考。在空间参考属性对话框中，可以选择、导入或创建新的坐标系。要设置空间参考的各个方面，例如 x、y、z 或 m 属性域、分辨率或容差，请使用“环境”对话框。</para>
        ///   <para>如果未提供空间参考，则输出将具有未定义的空间参考。</para>
        ///   <para>模板要素类的空间参考对输出空间参考没有影响。如果希望输出位于模板要素类的坐标系中，请将坐标系参数设置为模板要素类的空间参考。</para>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Coordinate System")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public object _spatial_reference { get; set; } = null;


        /// <summary>
        /// <para>Configuration Keyword</para>
        /// <para>The configuration keyword applies to enterprise geodatabase data only. It determines the storage parameters of the database table.</para>
        /// <para>配置关键字仅适用于企业级地理数据库数据。它确定数据库表的存储参数。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Configuration Keyword")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public object _config_keyword { get; set; } = null;


        /// <summary>
        /// <para>Output Spatial Grid 1</para>
        /// <para>This parameter has been deprecated in ArcGIS Pro. Any value you enter is ignored.</para>
        /// <para>此参数在 ArcGIS Pro 中已弃用。您输入的任何值都将被忽略。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Output Spatial Grid 1")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public double _spatial_grid_1 { get; set; } = 0;


        /// <summary>
        /// <para>Output Spatial Grid 2</para>
        /// <para>This parameter has been deprecated in ArcGIS Pro. Any value you enter is ignored.</para>
        /// <para>此参数在 ArcGIS Pro 中已弃用。您输入的任何值都将被忽略。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Output Spatial Grid 2")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public double _spatial_grid_2 { get; set; } = 0;


        /// <summary>
        /// <para>Output Spatial Grid 3</para>
        /// <para>This parameter has been deprecated in ArcGIS Pro. Any value you enter is ignored.</para>
        /// <para>此参数在 ArcGIS Pro 中已弃用。您输入的任何值都将被忽略。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Output Spatial Grid 3")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public double _spatial_grid_3 { get; set; } = 0;


        /// <summary>
        /// <para>Output Feature Class</para>
        /// <para></para>
        /// <para></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Output Feature Class")]
        [Description("")]
        [Option(OptionTypeEnum.derived)]
        public object _out_feature_class { get; set; }


        /// <summary>
        /// <para>Feature Class Alias</para>
        /// <para>The alternate name for the output feature class that will be created.</para>
        /// <para>将创建的输出要素类的备用名称。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Feature Class Alias")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public object _out_alias { get; set; } = null;


        public CreateFeatureclass SetEnv(object MResolution = null, object MTolerance = null, object XYDomain = null, object XYResolution = null, object XYTolerance = null, object ZResolution = null, object ZTolerance = null, object configKeyword = null, object geographicTransformations = null, object outputCoordinateSystem = null, object outputMFlag = null, object outputZFlag = null, object outputZValue = null)
        {
            base.SetEnv(MResolution: MResolution, MTolerance: MTolerance, XYDomain: XYDomain, XYResolution: XYResolution, XYTolerance: XYTolerance, ZResolution: ZResolution, ZTolerance: ZTolerance, configKeyword: configKeyword, geographicTransformations: geographicTransformations, outputCoordinateSystem: outputCoordinateSystem, outputMFlag: outputMFlag, outputZFlag: outputZFlag, outputZValue: outputZValue);
            return this;
        }

    }

}